const fs = require('fs');
const path = require('path');

const { constants } = fs;

module.exports = {
  /**
   * 检查某个文件是否存在，不存在则创建
   * @param {*} filePath 文件的名称
   */
  moduleFileInit: (fileName, callback) => {
    const filePath = path.resolve(__dirname, `../json/${fileName}`);
    fs.access(filePath, constants.F_OK, (err) => {
      if (err) {
        console.log(`${fileName} ===== 不存在`);
        fs.writeFile(filePath, JSON.stringify([]), 'utf-8', (err, data) => {
          if (err) {
            if (callback) {
              callback(`${fileName} ===== 创建失败`)
            }
            throw Error(`${fileName} ===== 创建失败`);
          }
          console.log(`${fileName} ===== 创建成功`);
        })
        return;
      }
      console.log(`${fileName} ===== 已存在`);
    })
  },
  /**
   * 根据key获取list中某一项的详细信息
   * @param {Array} dataList 数据源
   * @param {string} key key
   * @param {string} keyValue key的value
   * @returns 
   */
  getInfoByKey: (dataList, key, keyValue) => {
    let detailInfos = dataList.filter(item => item[key] === keyValue);
    return detailInfos.length > 0 ? detailInfos[0] : null;
  },
  /**
   * 获取list中id的最大值，直返会当前的最大值，空数组返回0
   * @param {*} dataList 
   * @returns 
   */
  getListMaxId: (dataList) => {
    if (dataList.length <= 0) {
      return 0;
    }
    return Number(dataList.sort((a, b) => Number(b.id) - Number(a.id))[0].id);
  },
  /**
   * 按照某个时间key对list进行排序
   * @param {*} list 待排序的list
   * @param {*} key 时间key
   * @param {string} type 比较字段的类型 time, number, others-默认
   * @param {*} isDesc true-倒序;false-正序;默认未false-正序
   * @returns 
   */
  listSortByKey(option) {
    const { list, key, isDesc = false, type = 'others' } = option;
    return list.sort((a, b) => {
      let at, bt;
      if(type === 'time'){
        at = new Date(a[key]).getTime();
        bt = new Date(b[key]).getTime();
      } else if(type === 'number'){
        at = a[key];
        bt = b[key];
      } else {
        at = a[key].toUpperCase();
        bt = b[key].toUpperCase();
      }
      if (at < bt) {
        return !isDesc ? -1 : 1;
      }
      if (at > bt) {
        return !isDesc ? 1 : -1;
      }
      return 0;
    })
  },
}
